package text_level;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author XieHao 谢昊
 * 这个类主要进行文本格式层面的转化(需要调用JavaSyntaxHighlighter类)
 * 将文本文件转为html格式
 * 并且将符合的不同代码部分高亮处理
 */
public class Transformation extends JavaSyntaxHighlighter {
    private String input_file;//记录读取路径
    private String output_file;//记录输出目标
    private String[] html_head = {"<!DOCTYPE html>",
            "<html>", "<head>", "<meta charset=\"UTF-8\">",
            "<title>", "generated by JavaSyntaxHighlighter", "</title>",
            "<style type=\"text/css\">",
            "pre{font-family:Consolas;font-size:13px;}",
            "pre{background:#fff9f9;}",
            ".key1{color:#00008F;font-weight:bold;}",
            ".key2{color:#1590EE;font-weight:bold;}",
            ".key3{color:#7D26CD;font-weight:bold;}",
            ".key4{color:#EE0000;font-weight:bold;}",
            ".key5{color:#7CFC00;font-weight:bold;}",
            ".note{color:#808080;font-weight:bold;font-style:italic;}",
            ".str{color:#EE7600;font-weight:bold;}",
            ".opr{color:#F000B2;font-weight:bolder;}",
            ".number{color:#45818e;font-weight:bold;}",
            ".noteplus{color:#b05001;font-weight:bold;font-style:italic;}",
            "</style>", "</head>", "<body>", "<pre>"};//记录输出到html头部的文件
    private String[] html_tail = {"</pre>", "</body>", "</html>"};//html尾文件,会添加到html的最后,作为标记格式设置的结束

    //得到html尾文件
    public String[] getHtml_tail() {
        return html_tail;
    }
    //得到html头文件
    public String[] getHtml_head() {
        return html_head;
    }
    //设置html尾文件
    public void setHtml_tail(String[] html_tail) {
        this.html_tail = html_tail;
    }
    //设置html头文件
    public void setHtml_head(String[] html_head) {
        this.html_head = html_head;
    }
    //改变html头文件具体的一行的内容
    public void change_head(int pos, String content) {
        html_head[pos] = content;
    }

    //有参构造方法,需输出输入输出目标
    public Transformation(String input_file, String output_file) throws Exception {
        super();
        try {
            this.input_file = input_file;
            this.output_file = output_file;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 转换这里开始进行 文本格式 转 代码高亮的html格式
     *
     * @return 如果成功运行, 无错误, 返回ture
     * @throws Exception 文件读取可能错误
     */
    public boolean Main_Transformation() throws Exception {
        File read_in_file = new File(input_file);// 指定要读取的文件
        File put_out_file = new File(output_file);

        //修改html的titile 改成原文件名
        Matcher m = Pattern.compile("(?<=\\\\)(\\w+)(?=\\.)").matcher(input_file);
        if (m.find()) {
            change_head(5, m.group());
        }

        //定义了文件输入输出流
        BufferedReader reader = null;
        PrintWriter output;
        try {//这里办正事= =\输出文件
            reader = new BufferedReader(new FileReader(read_in_file));
            output = new PrintWriter(put_out_file);

            //这里将html_head+\n先放到文件头部
            output.write(head_process());

            // 一次读入一行，直到读入null为文件结束
            String str;
            String data = "";
            while ((str = reader.readLine()) != null) {
                data += process(str);
            }
            output.write(data); //转换为html的<> 标签

            //这里放入html结尾格式
            output.write(tail_process());

            reader.close();//关闭输入
            output.close();//关闭输出

        } catch (Exception e) {//这里处理异常
            e.printStackTrace();
            return false;
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException ignored) {
                }
            }
            return true;
        }
    }


    /**
     * 处理html头文件,将其合并成一组字符串,除了头尾,每个都加/n换行
     *
     * @return 含 html头文件 的字符串
     */
    private String head_process() {
        StringBuilder temp = new StringBuilder();
        for (String str1 : html_head) {
            if (!str1.equals("<pre>")) {
                temp.append(str1 + '\n');
            } else {
                temp.append("<pre>");
            }
        }
        return temp.toString();
    }

    /**
     * 将得到的一行字符串,转成高亮后的html格式
     * 最后加个换行符
     *
     * @param string 输入中间的一行字符串,进行html转化和高亮处理
     * @return 返回处理后的字符串
     */
    private String process(String string) {
        String final_str;
        final_str = highlight(string);//进行代码高亮处理
        final_str += '\n';//最后每行换行

        return final_str;
    }

    /**
     * 处理html尾部文件格式,将其合并成一组字符串,除了头尾,中间以\n换行分隔
     *
     * @return 含 html尾部文件格式 的字符串
     */
    private String tail_process() {
        StringBuilder temp = new StringBuilder();
        for (String str2 : html_tail) {
            if (!str2.equals("</html>")) {
                temp.append(str2 + '\n');
            } else {
                temp.append("</html>");
            }
        }
        return temp.toString();
    }
}
